package com.tlgen.tomcat.utils;

import com.tlgen.spring.factory.SpeedDefaultListBeanFactory;
import com.tlgen.spring.model.BeanDefinition;

import java.util.List;
import java.util.Objects;

/**
 * 支持手写的 speed-spring 框架
 */
public class SpeedSpringContextUtils<T> {

    public static <T> T getBean(Class<T> clazz) {
        if (clazz.isInterface()) { // 判断是否是接口, 是接口则获取该接口的代理对象
            // 动态代理对象, 找到它的实现类, 实现类才可以被实例化
            List<String> implClassesByInterfaceClass = ScanUtils.getImplClassesByInterfaceClass(clazz);
            // 如果是接口, 直接从 bean 单例池中获取
            List<BeanDefinition> beanDefinitionList = SpeedDefaultListBeanFactory.getInstance().getBeanDefinitionList();
            BeanDefinition beanDefinition = beanDefinitionList.stream()
                    .filter(x -> Objects.equals(x.getClassName(), implClassesByInterfaceClass.get(0))).findFirst().orElse(null);
            if (Objects.isNull(beanDefinition))
                return null;
            return (T) beanDefinition.getInstance();
        }
        List<BeanDefinition> beanReferenceLinkDefinitionList = SpeedDefaultListBeanFactory.getInstance().getBeanDefinitionList();
        BeanDefinition beanDefinition = beanReferenceLinkDefinitionList.stream()
                .filter(x -> Objects.equals(clazz.getTypeName(), x.getClassName()))
                .findFirst()
                .orElse(null);
        if (Objects.isNull(beanDefinition))
            return null;
        return (T) beanDefinition.getInstance();
    }

}
